# 两数之和
# 给定一个整数数组 nums 和一个整数目标值 target，请你在该数组中找出和为目标值的那两个整数，并返回它们的数组下标。
# 你可以假设每种输入只会对应一个答案。但是，数组中同一个元素不能使用两遍。
# 输入: nums = [2, 7, 11, 15], target = 9
# 输出: [0, 1]
# 解释: 因为 nums[0] + nums[1] = 2 + 7 = 9
# nums = [2, 7, 11, 15]
# target = 9
# for i in range(len(nums)):
#     for j in range(i+1,len(nums)):
#         if nums[i] + nums[j] == target:
#             print(nums[i],nums[j],nums[i] + nums[j] ,'end')



#判断有效的括号
# def is_valid_parentheses(s: str) -> bool:
#     # 创建一个字典来存储括号的匹配关系
#     bracket_map = {')': '(', '}': '{', ']': '['}
#     # 初始化一个空栈
#     stack = []
    
#     # 遍历字符串中的每个字符
#     for char in s:
#         # 如果字符是右括号
#         if char in bracket_map:
#             # 弹出栈顶元素，如果栈为空则使用一个特殊字符
#             top_element = stack.pop() if stack else '#'
#             # 检查弹出的元素是否与当前右括号匹配
#             if bracket_map[char] != top_element :
#                 return False
#         else:
#             # 如果是左括号，压入栈中
#             stack.append(char)
    
#     # 如果栈为空，说明所有的括号都匹配
#     return not stack
def is_valid_parentheses(s: str) -> bool:
    # 初始化一个空栈
    stack = []
    
    # 遍历字符串中的每个字符
    for char in s:
        # 使用 match-case 语法来处理不同的字符
        match char:
            case '(':
                # 如果是左括号 '(', 压入对应的右括号 ')'
                stack.append(')')
            case '[':
                # 如果是左括号 '[', 压入对应的右括号 ']'
                stack.append(']')
            case '{':
                # 如果是左括号 '{', 压入对应的右括号 '}'
                stack.append('}')
            case ')':
                # 如果是右括号 ')', 检查栈顶元素是否为 ')'
                if not stack or stack.pop() != ')':
                    return False
            case ']':
                # 如果是右括号 ']', 检查栈顶元素是否为 ']'
                if not stack or stack.pop() != ']':
                    return False
            case '}':
                # 如果是右括号 '}', 检查栈顶元素是否为 '}'
                if not stack or stack.pop() != '}':
                    return False
            case _:
                # 如果遇到非括号字符，可以选择忽略或处理
                continue
    
    # 如果栈为空，说明所有的括号都匹配
    return not stack

# 示例用法
print(is_valid_parentheses("()"))        # 输出: True
print(is_valid_parentheses("()[]{}"))    # 输出: True
print(is_valid_parentheses("(]"))        # 输出: False
print(is_valid_parentheses("([)]"))      # 输出: False
print(is_valid_parentheses("{[]}"))      # 输出: True
print(is_valid_parentheses(")}(][{)("))  # 输出: False
      
        
# 示例用法
# print(is_valid_parentheses(")}(][{)("))      # 输出: True
# print(is_valid_parentheses("()[]{}"))  # 输出: True
# print(is_valid_parentheses("(]"))      # 输出: False
# print(is_valid_parentheses("([)]"))    # 输出: False
# print(is_valid_parentheses("{[]}"))    # 输出: True



s = input("请输入测试字符串：")


# 创建一个特殊列表

stack = []

   

for c in s:

    # 如果是左括号，那么添加到特殊列表中

    if c == '(' or c == '[' or c == '{':

        stack.append(c)

    # 如果是右括号的情况

    else:

        # 如果碰到右括号，但特殊列表中没有左括号，那么肯定是非法的

        if len(stack) == 0:

            print("非法T_T")

            break

   

        # 逐个给出 c 对应的右括号 d

        if c == ')':

            d = '('

        elif c == ']':

            d = '['

        elif c == '}':

            d = '{'

   

        # 对比 d 和从特殊列表尾部弹出的元素

        if d != stack.pop():

            print("非法T_T")

            break

else:

    # 如果循环走完，特殊列表不为空，那么肯定是左括号比右括号多的情况

    # 那肯定有同学会问：右括号比左括号多的情况在哪里判断？

    # 小甲鱼答：在上面 d != stack.pop() 的判断中已经可以排除了~

    if len(stack) == 0:

        print("合法^o^")

    else:

        print("非法T_T")